﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Com.Binaria.Core;
using Com.Binaria.Core.Enumeracion;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.SISCOB.DTO;
using Com.Binaria.SISCOB.Dom;
using Com.Binaria.SISCOB.Funcional.DTO;
using Com.Binaria.Core.Util;

namespace Com.Binaria.SISCOB.Mgr
{

    public class CartolaMayorMgr : ICartolaMayorMgr
    {
        #region ATRIBUTOS A EXPONER AL USUARIO
        public ICartolaMayorDom iCartolaMayorDom;
        public IRegistroContableDom iRegistroContableDom;
        public IConstante iConstante;
        #endregion

        #region Miembros de ICartolaMayorMgr
        public CartolaMayorFuncionalDTO GetById(ContextoDTO oContexto, System.Int32? Id)
        {
            CartolaMayorFuncionalDTO oItem = null;
            //
            try
            {
                CartolaMayorDTO tmp = iCartolaMayorDom.BuscarCartolaMayorPorId(oContexto, Id);
                if (tmp != null)
                {
                    oItem = new CartolaMayorFuncionalDTO();
                    oItem.Id = tmp.Id;
                    oItem.CuentaCorriente = Convert.ToInt32(tmp.IdCuentaCorriente);
                    oItem.FchEmision = tmp.FchEmision;
                    oItem.FchDesde = tmp.FchDesde;
                    oItem.FchHasta = tmp.FchHasta;
                    //Relacion : RegistroContable
                    RegistroContableDTO oRel1 = new RegistroContableDTO();
                    oRel1.IdCartolaMayor = Id;

                    IList<RegistroContableDTO> oRel1s = iRegistroContableDom.BuscarRegistroContableFiltro(oContexto, oRel1);
                    if (oRel1s != null && oRel1s.Count > 0) 
                    {
                        oItem.RegistroContable = new List<RegistroContableFuncionalDTO>(oRel1s.Count);
                        for (int i = 0; i < oRel1s.Count; i++) 
                        {
                            RegistroContableFuncionalDTO oDet = new RegistroContableFuncionalDTO();
                            oDet.Id = oRel1s[i].Id;
                            oDet.FchRegistro = oRel1s[i].FchRegistro;
                            oDet.Glosa = oRel1s[i].Glosa;
                            oDet.Monto = Convert.ToInt64(oRel1s[i].Monto);
                            oDet.Tipo = oRel1s[i].Tipo;
                            oDet.TipoText = iConstante.getDomains("domTipoRegistroContable").Where(itm => itm.Clave.Equals(oRel1s[i].Tipo)).First().Valor;
                            oDet.NmrDcto = oRel1s[i].NmrDcto;
                            oDet.NmrAsiento = oRel1s[i].NmrAsiento;
                            oDet.EstaProcesado = Convert.ToBoolean(oRel1s[i].EstaProcesado);
                            //
                            oItem.RegistroContable.Add(oDet);
                        }
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<CartolaMayorFuncionalDTO> GetAll(ContextoDTO oContexto)
        {
            IList<CartolaMayorFuncionalDTO> oItem = null;
            //
            try
            {
                IList<CartolaMayorDTO> tmp = iCartolaMayorDom.BuscarCartolaMayorTodos(oContexto);
                if (tmp != null)
                {
                    oItem = new List<CartolaMayorFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        CartolaMayorFuncionalDTO oFDto = new CartolaMayorFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.CuentaCorriente = Convert.ToInt32(tmp[i].IdCuentaCorriente);
                        oFDto.FchEmision = tmp[i].FchEmision;
                        oFDto.FchDesde = tmp[i].FchDesde;
                        oFDto.FchHasta = tmp[i].FchHasta;
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<CartolaMayorFuncionalDTO> GetBy(ContextoDTO oContexto, CartolaMayorFuncionalDTO item)
        {
            IList<CartolaMayorFuncionalDTO> oItem = null;
            //
            try
            {
                IList<CartolaMayorDTO> tmp = null;
                if (item == null)
                    tmp = iCartolaMayorDom.BuscarCartolaMayorTodos(oContexto);
                else
                {
                    CartolaMayorDTO oDto = new CartolaMayorDTO();
                    oDto.Id = item.Id;
                    if (item.CuentaCorriente > 0) oDto.IdCuentaCorriente = item.CuentaCorriente;
                    oDto.FchEmision = item.FchEmision;
                    oDto.FchDesde = item.FchDesde;
                    oDto.FchHasta = item.FchHasta;
                    //
                    tmp = iCartolaMayorDom.BuscarCartolaMayorFiltro(oContexto, oDto);
                }

                if (tmp != null)
                {
                    oItem = new List<CartolaMayorFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        CartolaMayorFuncionalDTO oFDto = new CartolaMayorFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.CuentaCorriente = Convert.ToInt32(tmp[i].IdCuentaCorriente);
                        oFDto.FchEmision = tmp[i].FchEmision;
                        oFDto.FchDesde = tmp[i].FchDesde;
                        oFDto.FchHasta = tmp[i].FchHasta;
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        [Binaria.Core.Attribute.Trasanction(System.Transactions.TransactionScopeOption.Required)]
        public bool Save(ContextoDTO oContexto, CartolaMayorFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);
            List<int> oUpd = null;
            try
            {
                //Relacion : RegistroContable  - Comprobar Composicion C
                if (item.RegistroContable == null || item.RegistroContable.Count < 1)
                    throw new ManagerException("La relacion «RegistroContable» espera al menos 1 elemento", System.Diagnostics.TraceEventType.Warning);

                CartolaMayorDTO oDto = new CartolaMayorDTO();
                oDto.Id = item.Id;
                oDto.IdCuentaCorriente = item.CuentaCorriente;
                oDto.FchEmision = item.FchEmision;
                oDto.FchDesde = item.FchDesde;
                oDto.FchHasta = item.FchHasta;

                if (IsExist)
                    iCartolaMayorDom.RegistrarCartolaMayor(oContexto, new List<CartolaMayorDTO>() { oDto }, EnumRegistrarAccion.Modificar);
                else
                    iCartolaMayorDom.RegistrarCartolaMayor(oContexto, new List<CartolaMayorDTO>() { oDto }, EnumRegistrarAccion.Agregar);

                //Relacion MD18: RegistroContable
                oUpd = null;
                if (IsExist)
                {
                    RegistroContableDTO oRel1 = new RegistroContableDTO();
                    oRel1.IdCartolaMayor = oDto.Id;
                    List<RegistroContableDTO> oRel1s = iRegistroContableDom.BuscarRegistroContableFiltro(oContexto, oRel1);
                    if (oRel1s != null && oRel1s.Count > 0)
                    {
                        //UPD - DEL
                        if (item.RegistroContable != null)
                        {
                            oUpd = item.RegistroContable.Join(oRel1s
                                    , ori => ori.Id
                                    , des => des.Id
                                    , (ori, des) => (int)des.Id).ToList();
        
                            oRel1s = oRel1s.Where(ori => !item.RegistroContable.Any(des => des.Id == ori.Id)).ToList();
                        }
                    }
                    iRegistroContableDom.RegistrarRegistroContable(oContexto, oRel1s, EnumRegistrarAccion.Eliminar);
                }
                
                if (item.RegistroContable != null) 
                {
                    for (int i = 0; i < item.RegistroContable.Count; i++) 
                    {
                        RegistroContableDTO oRel1 = new RegistroContableDTO();
                        oRel1.IdCartolaMayor = oDto.Id;                        
                        oRel1.Id = item.RegistroContable[i].Id;
                        bool esta_ = (oUpd != null && oRel1.Id.HasValue && oUpd.Contains((int)oRel1.Id));
                        //
                        oRel1.FchRegistro = item.RegistroContable[i].FchRegistro;
                        oRel1.Glosa = item.RegistroContable[i].Glosa;
                        oRel1.Monto = item.RegistroContable[i].Monto;
                        oRel1.Tipo = item.RegistroContable[i].Tipo;
                        oRel1.NmrDcto = item.RegistroContable[i].NmrDcto;
                        oRel1.NmrAsiento = item.RegistroContable[i].NmrAsiento;
                        oRel1.EstaProcesado = item.RegistroContable[i].EstaProcesado;
                        //
                        iRegistroContableDom.RegistrarRegistroContable(oContexto, new List<RegistroContableDTO>() { oRel1 }, esta_ ? EnumRegistrarAccion.Modificar : EnumRegistrarAccion.Agregar);
                    }
                }
                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }

        [Binaria.Core.Attribute.Trasanction(System.Transactions.TransactionScopeOption.Required)]
        public bool Delete(ContextoDTO oContexto, CartolaMayorFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);

            try
            {
                CartolaMayorDTO oDto = new CartolaMayorDTO();
                oDto.Id = item.Id;
                
                if (IsExist)
                {
                    //Relacion :  RegistroContable
                    RegistroContableDTO oRel1 = new RegistroContableDTO();
                    oRel1.Id = item.Id;
                    List<RegistroContableDTO> oRel1s = iRegistroContableDom.BuscarRegistroContableFiltro(oContexto, oRel1);
                    if (oRel1s != null && oRel1s.Count > 0)
                    {
                        iRegistroContableDom.RegistrarRegistroContable(oContexto, oRel1s, EnumRegistrarAccion.Eliminar);
                    }
                    iCartolaMayorDom.RegistrarCartolaMayor(oContexto, new List<CartolaMayorDTO>() { oDto }, EnumRegistrarAccion.Eliminar);
                }
                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }

        public IList<CartolaMayorFuncionalDTO> GetAllPag(ContextoDTO oContexto, CartolaMayorFuncionalDTO item)
        {
            IList<CartolaMayorFuncionalDTO> oItem = null;
            //
            try
            {
                IList<CartolaMayorDTO> tmp = null;
                if (item == null)
                    tmp = iCartolaMayorDom.BuscarCartolaMayorTodos(oContexto);
                else
                {
                    CartolaMayorDTO oDto = new CartolaMayorDTO();
                    oDto.Id = item.Id;
                    if (item.CuentaCorriente > 0) oDto.IdCuentaCorriente = item.CuentaCorriente;
                    oDto.FchEmision = item.FchEmision;
                    oDto.FchDesde = item.FchDesde;
                    oDto.FchHasta = item.FchHasta;
                    if (item.Pagina > 0) oDto.Pagina = item.Pagina;
                    if (item.SizePagina > 0) oDto.SizePagina = item.SizePagina;
                    if (!string.IsNullOrEmpty(item.ColumnOrden)) oDto.ColumnOrden = item.ColumnOrden;
                    if (!string.IsNullOrEmpty(item.TipoOrden)) oDto.TipoOrden = item.TipoOrden;
                    //
                    tmp = iCartolaMayorDom.BuscarCartolaMayorFiltroPaginado(oContexto, oDto);
                }

                if (tmp != null)
                {
                    oItem = new List<CartolaMayorFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        CartolaMayorFuncionalDTO oFDto = new CartolaMayorFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.CuentaCorriente = Convert.ToInt32(tmp[i].IdCuentaCorriente);
                        oFDto.FchEmision = tmp[i].FchEmision;
                        oFDto.FchDesde = tmp[i].FchDesde;
                        oFDto.FchHasta = tmp[i].FchHasta;
                        oFDto.TotalRegistros = Convert.ToInt64(tmp[i].TotalRegistros);
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        
        #endregion
    }
}
